namespace MyCompany.Interfaces {
	using System.Collections.Generic;

	/// <summary>
	///     See IDictionary. This is the same except that methods that might change the dictionary are not provided.
	/// </summary>
	/// <typeparam name="TKey"> </typeparam>
	/// <typeparam name="TValue"> </typeparam>
	public interface IReadOnlyDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>> {
		/// <summary>
		///     See IDictionary.
		/// </summary>
		int Count { get; }

		/// <summary>
		///     See IDictionary.
		/// </summary>
		ICollection<TKey> Keys { get; }

		/// <summary>
		///     See IDictionary.
		/// </summary>
		ICollection<TValue> Values { get; }

		/// <summary>
		///     See IDictionary.
		/// </summary>
		/// <param name="key"> </param>
		TValue this[TKey key] { get; }

		/// <summary>
		///     See IDictionary.
		/// </summary>
		/// <param name="item"> </param>
		/// <returns> </returns>
		bool Contains(KeyValuePair<TKey, TValue> item);

		/// <summary>
		///     See IDictionary.
		/// </summary>
		/// <param name="key"> </param>
		/// <returns> </returns>
		bool ContainsKey(TKey key);

		/// <summary>
		///     See IDictionary.
		/// </summary>
		/// <param name="array"> </param>
		/// <param name="arrayIndex"> </param>
		void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex);

		/// <summary>
		///     See IDictionary.
		/// </summary>
		/// <param name="key"> </param>
		/// <param name="value"> </param>
		/// <returns> </returns>
		bool TryGetValue(TKey key, out TValue value);
	}
}
